package cn.sys.controller;

import cn.sys.domain.Menu;
import cn.sys.domain.TreeNode;
import cn.sys.domain.TreeNodeBuilder;
import cn.sys.domain.User;
import cn.sys.service.MenuService;
import cn.sys.utils.DataGridView;
import cn.sys.utils.ResultObj;
import cn.sys.utils.WebUtils;
import cn.sys.vo.MenuVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Mxb
 * @version 1.0
 * @date 2019/10/28 20:50
 * 左侧菜单控制器
 */
@RestController
@RequestMapping("menu")
public class MenuController {
    //注入service
    @Autowired
    private MenuService menuService;

    //加载首页左侧菜单 列表
    @RequestMapping("loadIndexLeftMenuJson")
    public List<TreeNode> loadIndexLeftMenuJson(MenuVo menuVo) {
        // 得到当前登录的用户对象
        User user = (User) WebUtils.getHttpSession().getAttribute("user");

        List<Menu> list = null;
        menuVo.setAvailable(1);//只查询有用的
        //如果是超级管理员  显示所有的菜单列表  1代表超级管理员
        if (user.getType() == 1) {
            list = this.menuService.queryAllMenu(menuVo);
            // 使用redis缓存
            //list = this.menuService.findAllMenuForList();
        } else {
            //2：不是超级管理员  显示有权限的 菜单列表
            list = this.menuService.queryMenuByUserIdForList(menuVo, user.getUserid());
        }

        List<TreeNode> nodes = new ArrayList<>();
        //把list中的数据放到nodes中
        for (Menu menu : list) {
            Integer id = menu.getId();
            Integer pid = menu.getPid();
            String title = menu.getTitle();
            String icon = menu.getIcon();
            String href = menu.getHref();
            Boolean spread = menu.getSpread() == 1 ? true : false;
            String target = menu.getTarget();

            nodes.add(new TreeNode(id, pid, title, icon, href, spread, target));

        }
        return TreeNodeBuilder.builder(nodes, 1);

    }

    /*****************************************************************************************************/
    //  菜单管理
    /*加载菜单管理左边的菜单树*/
    @RequestMapping("loadMenuManagerLeftTreeJson")
    public DataGridView loadMenuManagerLeftTree(MenuVo menuVo) {
        menuVo.setAvailable(1);//只查询有用的
        List<Menu> list = this.menuService.queryAllMenu(menuVo);
        List<TreeNode> nodes = new ArrayList<>();

        for (Menu menu : list) {
            Integer id = menu.getId();
            Integer pid = menu.getPid();
            String title = menu.getTitle();
            String icon = menu.getIcon();
            String href = menu.getHref();
            Boolean spread = menu.getSpread() == 1 ? true : false;
            String target = menu.getTarget();

            nodes.add(new TreeNode(id, pid, title, icon, href, spread, target));

        }
        return new DataGridView(nodes);
    }

    /*****************************************************************************************************/

    /*加载菜单列表，返回DataGridView*/
    @RequestMapping("loadAllMenuJson")
    public DataGridView loadAllMenu(MenuVo menuVo) {
        return this.menuService.queryAllMenuRight(menuVo);
    }

    /*添加菜单*/
    @RequestMapping("addMenu")
    public ResultObj addMenu(MenuVo menuVo) {
        try {
            this.menuService.addMenu(menuVo);
            return ResultObj.ADD_SUCCESS;

        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.ADD_ERROR;

        }


    }

    /*修改菜单*/
    @RequestMapping("updateMenu")
    public ResultObj updateMenu(MenuVo menuVo) {
        try {
            this.menuService.updateMenu(menuVo);
            return ResultObj.UPDATE_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.UPDATE_ERROR;
        }
    }

    /*根据id判断当前菜单是否有子节点*/
    @RequestMapping("checkMenuHasChildred")
    public ResultObj checkMenuHasChildred(MenuVo menuVo) {
        Integer count = this.menuService.queryMenuByPid(menuVo.getId());
        if (count > 0) {
            return ResultObj.STATUS_TRUE;
        } else {
            return ResultObj.STATUS_ERROR;
        }
    }

    /*删除菜单*/
    @RequestMapping("deleteMenu")
    public ResultObj deleteMenu(MenuVo menuVo) {
        try {
            this.menuService.deleteMenu(menuVo);
            return ResultObj.DELETE_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        }
    }
}
